#include "cam.h"
uint16_t x = 0; // x坐标
uint16_t y = 0; // y坐标
uint16_t blob_area = 0 ; // 色块面积
uint8_t is_findblob = 0; // 是否找到色块
uint8_t yolo_flag = 0; // 是否使用YOLO检测数字
cam_data_struct cam_data = {0};
//数字取值为1~9，建立哈希表
uint8_t hash_table[10] = {0};

uint8_t Cam_DMA_Buffer[20] = {0}; // DMA接收数据缓冲区

// # 打包为字节并发送，包头0x02、包尾0xFF、换行
//         serial.write(struct.pack('B', 0x02))  # 包头
//         serial.write(struct.pack('B', x_high))
//         serial.write(struct.pack('B', x_low))
//         serial.write(struct.pack('B', y_high))
//         serial.write(struct.pack('B', y_low))
//         serial.write(struct.pack('B', 0xFF))  # 包尾
//         serial.write(struct.pack('B', ord('\n')))
//void cam_init(void)
//{
//    DL_DMA_setSrcAddr(DMA,DMA_CH0_CHAN_ID, (uint32_t)(&UART_1_INST->RXDATA));
//    DL_DMA_setDestAddr(DMA,DMA_CH0_CHAN_ID, (uint32_t)(&Cam_DMA_Buffer[0]));
//    DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, 11);
//    DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);
//}
float adaptive_PID(uint16_t blob_area, float cal_out)
{
    // 定义参考面积
    const float area_ref = 3360.0f;
    // 定义面积边界，防止极端值
    const float area_min = 1560.0f;
    const float area_max = 17100.0f;
    // 定义输出边界（可根据实际调整）
    const float out_min = 0.01f;
    const float out_max = 100.0f;

    // 限制面积范围
    float area = (float)blob_area;
    if(area < area_min) area = area_min;
    if(area > area_max) area = area_max;

    // 缩放
    float scale = area / area_ref;
    float result = cal_out * scale;

    // 限制输出范围
    if(result < out_min) result = out_min;
    if(result > out_max) result = out_max;

    return result;
}

void cal_cam_receive_data(uint8_t *data_buffer)
{
    if (data_buffer[0] == 0x02 && data_buffer[9] == 0xFF) 
    {
        XY_Servo.x_delta = (data_buffer[1] << 8) | data_buffer[2]; // 高位在前
        XY_Servo.y_delta = (data_buffer[3] << 8) | data_buffer[4]; // 高位在前
        blob_area = (data_buffer[5] << 8) | data_buffer[6]; // 高位在前
        is_findblob = data_buffer[7]; // 是否找到色块
    
        
    }
}

void cam_proc(void)
{
    
}